data <- read.delim("/Users/carolineyu/Documents/GitHub/course_materials/Exercises/03_student_loans/data/survey_SCF.txt", sep = ",")
library(ggplot2)
library(dplyr)
library(tidyr)
1. Debt over time
data1 <- data %>%
group_by(YEAR) %>%
summarise(avg_debt = mean(DEBT, na.rm = TRUE))
debt_graph <- ggplot(data1, aes(YEAR, avg_debt)) + geom_line()
debt_graph

I draw a graph whose x-axis is YEAR, and y-axis is averge of debt the households have. This graph indicates that the average amount of debt decrease since 2007.
data2 <- data %>%
mutate(eduratio = EDN_INST/DEBT) %>%
group_by(YEAR) %>%
summarise(avg_eduratio = mean(eduratio, na.rm = TRUE))
educratio_graph <- ggplot(data2, aes(YEAR, avg_eduratio, col = )) + geom_line()
educratio_graph

And the averge ratio of education loan to debt is growing, which indicates that education loan plays a more and more important role in the debt.
data3 <- data %>%
group_by(YEAR) %>%
summarise(avg_installratio = mean(INSTALL/DEBT,na.rm = TRUE),
avg_vehiratio = mean(VEH_INST/DEBT,na.rm = TRUE),
avg_eduratio = mean(EDN_INST/DEBT,na.rm = TRUE),
avg_mortratio = mean(NH_MORT/DEBT,na.rm = TRUE),
avg_othratio = mean(OTHLOC/DEBT, na.rm = TRUE),
avg_ccbratio = mean(CCBAL/DEBT, na.rm = TRUE))
data61 <- gather(data3, key = variable , value = mean, -YEAR)
bar1 <- ggplot(data61,aes(x = variable, y = mean)) + geom_bar(stat = 'identity', aes(fill = variable)) + facet_wrap(vars(YEAR)) + labs(xlab = "loan/debt ratio", y = "Mean Value", title = "Different Debt Ratio from 1989 to 2016") + theme(axis.text.x=element_blank())
bar1

data4 <- data %>%
group_by(YEAR) %>%
summarise(avg_install = mean(INSTALL,na.rm = TRUE),
avg_vehi = mean(VEH_INST,na.rm = TRUE),
avg_edu = mean(EDN_INST,na.rm = TRUE),
avg_mort = mean(NH_MORT,na.rm = TRUE),
avg_oth = mean(OTHLOC, na.rm = TRUE),
avg_ccb = mean(CCBAL, na.rm = TRUE))
library(tidyr)
data51 <- gather(data4, key = variable , value = mean, -YEAR)
bar <- ggplot(data51,aes(x = variable, y = mean)) + geom_bar(stat = 'identity', aes(fill = variable)) + facet_wrap(vars(YEAR)) + labs(xlab = "Different loans", y = "Mean Value", title = "Different Debt Amount from 1989 to 2016") + theme(axis.text.x=element_blank())
bar

p1 <- ggplot(data3, aes(x = YEAR)) + geom_line(aes(y=avg_installratio, col = "avg_installratio")) + geom_line(aes(y = avg_vehiratio, col = "avg_vehiratio")) + geom_line(aes(y=avg_eduratio, col = "avg_eduratio")) + geom_line(aes(y= avg_mortratio, col = "avg_mortraitio")) + geom_line(aes(y= avg_othratio, col = "avg_othratio"))+ geom_line(aes(y=avg_ccbratio, col = "avg_ccbratio")) + labs(x = "YEAR", y = "Percentage", title = "Change in percentage of loans in debt from 1989 - 2016")
p1

If audiences want know the change of these loans during Year 1989-2016, I would recommend them use the line. However, if we are going to look at in each year, the propotion of different types of loans, I would use bar and facet by years.
2. Tell me who you are
datawho <- filter(data, YEAR == 2016)
datawho1 <- datawho%>%
select(c("AGECL","KIDS","MARRIED","EDUC","DEBT2INC","LEVRATIO","NETWORTH"))
datawho2 <- datawho1 %>%
mutate(KIDS1 = ifelse(KIDS >0, 1, 0))%>%
group_by(AGECL, KIDS1, EDUC) %>%
summarise(avg_DEBT2INC = mean(DEBT2INC, na.rm = TRUE),
avg_NEWWORTH = mean(NETWORTH, na.rm = TRUE))%>%
arrange(AGECL)
p2 <- ggplot(datawho2) + geom_col(aes(x=EDUC, y=avg_DEBT2INC, fill = 'red' )) + facet_wrap(vars(KIDS1)) + labs(title = "Relationship between debt to income and education degree")
p2

p3 <- ggplot(datawho1) + geom_boxplot(aes(y=DEBT2INC, color = factor(EDUC))) + scale_y_log10() + labs(title = "Relationship between debt to income and education degree")
p3

I would recommend the box plot. It shouws the tendeny the debt to income change in different education groups. And it contains more information than I use the average of debt to income in different eduction levels.
3. Wealth and Income Distribution
We may expect households with higher incomes, larger capital gains, and more wealth to generally be less indebted. On the other hand, higher incomes may be the result of longer (and potentially more expensive) education. Again, using the data from 2016 only, investigate how income and wealth are related to student loan debt. Consider using the variables Income percentile groups (INCCAT) and Net worth percentile groups (NWCAT) for this analysis.
Show 1-2 visualizations for this section, and as before, briefly tell the editor what you recommend.
data2016 <- filter(data, YEAR == 2016)
wealdata <- select(data2016, c("EDUC","EDN_INST","INCCAT","NWCAT"))
wealdata2 <- wealdata %>%
group_by(NWCAT, INCCAT) %>%
summarise(avg_edn = mean(EDN_INST))
w2 <- ggplot(wealdata2) + geom_col(aes(INCCAT, avg_edn)) + facet_wrap(vars(NWCAT))
w2

w3 <- ggplot(wealdata) + geom_boxplot(aes(y = EDN_INST, color = factor(INCCAT))) + scale_y_log10()
w3

For people from higher income percentile groups, they would probably have more education loans. And for people who are rich, they would hardly have education loans. I would recommend editor to combine two graphs together, since it can show the relationship between education loans, income, education degree and the networth.
4. Going broke
broke_data <- select(data2016, c("BNKRUPLAST5","FOODHOME","FOODDELV","FOODAWAY","PIRTOTAL"))
broke_data2 <- data %>%
group_by(BNKRUPLAST5, YEAR) %>%
summarise(
avg_edu_debt_ratio = mean(EDN_INST/DEBT, na.rm = TRUE)
)
broke_data2
b2 <- ggplot(filter(broke_data2, YEAR > 1996), aes(x= YEAR, y = avg_edu_debt_ratio)) + geom_bar(stat="identity",aes(fill = factor(BNKRUPLAST5)), position = "dodge") + ggtitle("Average ratio of EDUC/DEBT from 1998-2016")
b2

For people who finally go bankrupt, they usually have higher education loan than people who don’t go bankrupt. And as time went by, the education loan takes a large propotion of total debt.
broke_data1 <- broke_data%>%
filter(BNKRUPLAST5 == 1) %>%
mutate(goodfood = FOODAWAY + FOODDELV)
f <- ggplot(broke_data1, aes(y = PIRTOTAL)) + geom_point(mapping = aes(x = goodfood, col = "goodfood")) + geom_point(mapping = aes(x = FOODHOME, col = 'FOODHOME')) + labs(x = "count", y = "Pirototal", title = "Bankrupt people non-thrifty behavior")
f

For people who go bankrupt, they tend to eat at home rather than have food delivery or eat outside.
broke_data3 <- broke_data%>%
filter(BNKRUPLAST5 == 0) %>%
mutate(goodfood = FOODAWAY + FOODDELV)
g <- ggplot(broke_data3) + geom_point(mapping = aes(x = goodfood, y = FOODHOME)) +geom_abline(aes(intercept = 0, slope = 1, color = "red")) + xlim(0, 10000) + ylim(0, 10000)
g

People who don’t go bankrupt tend to eat at home rather than eat outside or have a food delivery. However, the tendency they order a food delivery or eat outside is much higher than people who go bankrupt.
5. Make two plots interactive
library(plotly)
ggplotly(b2)
This graph can tell people how the education loan play an important role in the total debt people have as time went by.
ggplotly(bar)
This graph indicate that in each year, different types of loans people have, and readers can have straightforward information about the change of amount each loan in different years. ### 6. Data Table
library(DT)
datafinal <- data %>%
group_by(AGECL,YEAR) %>%
summarise(
avg_install = mean(INSTALL,na.rm = TRUE),
avg_vehi = mean(VEH_INST,na.rm = TRUE),
avg_edu = mean(EDN_INST,na.rm = TRUE),
avg_mort = mean(NH_MORT,na.rm = TRUE),
avg_oth = mean(OTHLOC, na.rm = TRUE),
avg_ccb = mean(CCBAL, na.rm = TRUE))
datatable(datafinal)
datafinal %>%
datatable(
rownames = FALSE,
filter = list(position = "top"),
options = list(language = list(sSearch = "Filter:"))
)
This table is going to look at at different years, at different age groups the average of different types of loans the householders have.
LS0tCnRpdGxlOiAgIkhvbWV3b3JrIDEgLS0gU3R1ZGVudCBkZWJ0IGxvYW4iCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IENhcm9saW5lIFl1IAotLS0KCmBgYHtyIFNldHVwLCBpbmNsdWRlPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgd2FybmluZz1GQUxTRX0KbGlicmFyeShrbml0cikKb3B0c19jaHVuayRzZXQoZmlnLnBhdGg9ImZpZ3VyZXMvIiwKICAgICAgICAgICAgICAgY2FjaGUucGF0aD0iY2FjaGUvIiwKICAgICAgICAgICAgICAgY2FjaGU9RkFMU0UsCiAgICAgICAgICAgICAgIGVjaG89VFJVRSwKICAgICAgICAgICAgICAgbWVzc2FnZT1GQUxTRSwKICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkgIApgYGAgIAoKYGBge3J9CmRhdGEgPC0gcmVhZC5kZWxpbSgiL1VzZXJzL2Nhcm9saW5leXUvRG9jdW1lbnRzL0dpdEh1Yi9jb3Vyc2VfbWF0ZXJpYWxzL0V4ZXJjaXNlcy8wM19zdHVkZW50X2xvYW5zL2RhdGEvc3VydmV5X1NDRi50eHQiLCBzZXAgPSAiLCIpCmBgYAoKYGBge3IgbWVzc2FnZSA9IEZBTFNFfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmBgYAoKIyMjIyAxLiBEZWJ0IG92ZXIgdGltZQoKYGBge3J9CmRhdGExIDwtIGRhdGEgJT4lCiAgZ3JvdXBfYnkoWUVBUikgJT4lCiAgc3VtbWFyaXNlKGF2Z19kZWJ0ID0gbWVhbihERUJULCBuYS5ybSA9IFRSVUUpKQpgYGAKCmBgYHtyfQpkZWJ0X2dyYXBoIDwtIGdncGxvdChkYXRhMSwgYWVzKFlFQVIsIGF2Z19kZWJ0KSkgKyBnZW9tX2xpbmUoKQpkZWJ0X2dyYXBoCmBgYApJIGRyYXcgYSBncmFwaCB3aG9zZSB4LWF4aXMgaXMgWUVBUiwgYW5kIHktYXhpcyBpcyBhdmVyZ2Ugb2YgZGVidCB0aGUgaG91c2Vob2xkcyBoYXZlLiBUaGlzIGdyYXBoIGluZGljYXRlcyB0aGF0IHRoZSBhdmVyYWdlIGFtb3VudCBvZiBkZWJ0IGRlY3JlYXNlIHNpbmNlIDIwMDcuCgpgYGB7cn0KZGF0YTIgPC0gZGF0YSAlPiUKICBtdXRhdGUoZWR1cmF0aW8gPSBFRE5fSU5TVC9ERUJUKSAlPiUKICBncm91cF9ieShZRUFSKSAlPiUKICBzdW1tYXJpc2UoYXZnX2VkdXJhdGlvID0gbWVhbihlZHVyYXRpbywgbmEucm0gPSBUUlVFKSkKYGBgCgpgYGB7cn0KZWR1Y3JhdGlvX2dyYXBoIDwtIGdncGxvdChkYXRhMiwgYWVzKFlFQVIsIGF2Z19lZHVyYXRpbywgY29sID0gKSkgKyBnZW9tX2xpbmUoKQplZHVjcmF0aW9fZ3JhcGggCmBgYApBbmQgdGhlIGF2ZXJnZSByYXRpbyBvZiBlZHVjYXRpb24gbG9hbiB0byBkZWJ0IGlzIGdyb3dpbmcsIHdoaWNoIGluZGljYXRlcyB0aGF0IGVkdWNhdGlvbiBsb2FuIHBsYXlzIGEgbW9yZSBhbmQgbW9yZSBpbXBvcnRhbnQgcm9sZSBpbiB0aGUgZGVidC4KCmBgYHtyfQpkYXRhMyA8LSBkYXRhICU+JQogIGdyb3VwX2J5KFlFQVIpICU+JQogIHN1bW1hcmlzZShhdmdfaW5zdGFsbHJhdGlvID0gbWVhbihJTlNUQUxML0RFQlQsbmEucm0gPSBUUlVFKSwKICAgICAgICAgICBhdmdfdmVoaXJhdGlvID0gbWVhbihWRUhfSU5TVC9ERUJULG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgYXZnX2VkdXJhdGlvID0gbWVhbihFRE5fSU5TVC9ERUJULG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgYXZnX21vcnRyYXRpbyA9IG1lYW4oTkhfTU9SVC9ERUJULG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgYXZnX290aHJhdGlvID0gbWVhbihPVEhMT0MvREVCVCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICBhdmdfY2NicmF0aW8gPSBtZWFuKENDQkFML0RFQlQsIG5hLnJtID0gVFJVRSkpIAogZGF0YTYxIDwtIGdhdGhlcihkYXRhMywga2V5ID0gdmFyaWFibGUgLCB2YWx1ZSA9IG1lYW4sIC1ZRUFSKQpgYGAKCmBgYHtyfQpiYXIxIDwtIGdncGxvdChkYXRhNjEsYWVzKHggPSB2YXJpYWJsZSwgeSA9IG1lYW4pKSArIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBhZXMoZmlsbCA9IHZhcmlhYmxlKSkgKyBmYWNldF93cmFwKHZhcnMoWUVBUikpICsgbGFicyh4bGFiID0gImxvYW4vZGVidCByYXRpbyIsIHkgPSAiTWVhbiBWYWx1ZSIsIHRpdGxlID0gIkRpZmZlcmVudCBEZWJ0IFJhdGlvIGZyb20gMTk4OSB0byAyMDE2IikgKyAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpKQpiYXIxCmBgYAoKYGBge3J9CmRhdGE0IDwtIGRhdGEgJT4lCiAgZ3JvdXBfYnkoWUVBUikgJT4lCiAgc3VtbWFyaXNlKGF2Z19pbnN0YWxsID0gbWVhbihJTlNUQUxMLG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgYXZnX3ZlaGkgPSBtZWFuKFZFSF9JTlNULG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgYXZnX2VkdSA9IG1lYW4oRUROX0lOU1QsbmEucm0gPSBUUlVFKSwKICAgICAgICAgICBhdmdfbW9ydCA9IG1lYW4oTkhfTU9SVCxuYS5ybSA9IFRSVUUpLAogICAgICAgICAgIGF2Z19vdGggPSBtZWFuKE9USExPQywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICBhdmdfY2NiID0gbWVhbihDQ0JBTCwgbmEucm0gPSBUUlVFKSkgCmBgYApgYGB7cn0KbGlicmFyeSh0aWR5cikKIGRhdGE1MSA8LSBnYXRoZXIoZGF0YTQsIGtleSA9IHZhcmlhYmxlICwgdmFsdWUgPSBtZWFuLCAtWUVBUikKYGBgCgpgYGB7cn0KYmFyIDwtIGdncGxvdChkYXRhNTEsYWVzKHggPSB2YXJpYWJsZSwgeSA9IG1lYW4pKSArIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBhZXMoZmlsbCA9IHZhcmlhYmxlKSkgKyBmYWNldF93cmFwKHZhcnMoWUVBUikpICsgIGxhYnMoeGxhYiA9ICJEaWZmZXJlbnQgbG9hbnMiLCB5ID0gIk1lYW4gVmFsdWUiLCB0aXRsZSA9ICJEaWZmZXJlbnQgRGVidCBBbW91bnQgZnJvbSAxOTg5IHRvIDIwMTYiKSArICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCkpCmJhcgpgYGAKCgpgYGB7cn0KcDEgPC0gZ2dwbG90KGRhdGEzLCBhZXMoeCA9IFlFQVIpKSArIGdlb21fbGluZShhZXMoeT1hdmdfaW5zdGFsbHJhdGlvLCBjb2wgPSAiYXZnX2luc3RhbGxyYXRpbyIpKSArIGdlb21fbGluZShhZXMoeSA9IGF2Z192ZWhpcmF0aW8sIGNvbCA9ICJhdmdfdmVoaXJhdGlvIikpICsgZ2VvbV9saW5lKGFlcyh5PWF2Z19lZHVyYXRpbywgY29sID0gImF2Z19lZHVyYXRpbyIpKSArIGdlb21fbGluZShhZXMoeT0gYXZnX21vcnRyYXRpbywgY29sID0gImF2Z19tb3J0cmFpdGlvIikpICsgIGdlb21fbGluZShhZXMoeT0gYXZnX290aHJhdGlvLCBjb2wgPSAiYXZnX290aHJhdGlvIikpKyAgZ2VvbV9saW5lKGFlcyh5PWF2Z19jY2JyYXRpbywgY29sID0gImF2Z19jY2JyYXRpbyIpKSArIGxhYnMoeCA9ICJZRUFSIiwgeSA9ICJQZXJjZW50YWdlIiwgdGl0bGUgPSAiQ2hhbmdlIGluIHBlcmNlbnRhZ2Ugb2YgbG9hbnMgaW4gZGVidCBmcm9tIDE5ODkgLSAyMDE2IikKcDEKYGBgCklmIGF1ZGllbmNlcyB3YW50IGtub3cgdGhlIGNoYW5nZSBvZiB0aGVzZSBsb2FucyBkdXJpbmcgWWVhciAxOTg5LTIwMTYsIEkgd291bGQgcmVjb21tZW5kIHRoZW0gdXNlIHRoZSBsaW5lLiBIb3dldmVyLCBpZiB3ZSBhcmUgZ29pbmcgdG8gbG9vayBhdCBpbiBlYWNoIHllYXIsIHRoZSBwcm9wb3Rpb24gb2YgZGlmZmVyZW50IHR5cGVzIG9mIGxvYW5zLCBJIHdvdWxkIHVzZSBiYXIgYW5kIGZhY2V0IGJ5IHllYXJzLgoKIyMjIDIuIFRlbGwgbWUgd2hvIHlvdSBhcmUKYGBge3J9CmRhdGF3aG8gPC0gZmlsdGVyKGRhdGEsIFlFQVIgPT0gMjAxNikKYGBgCgpgYGB7cn0KZGF0YXdobzEgPC0gZGF0YXdobyU+JQogIHNlbGVjdChjKCJBR0VDTCIsIktJRFMiLCJNQVJSSUVEIiwiRURVQyIsIkRFQlQySU5DIiwiTEVWUkFUSU8iLCJORVRXT1JUSCIpKQpgYGAKCmBgYHtyfQpkYXRhd2hvMiA8LSBkYXRhd2hvMSAlPiUKICBtdXRhdGUoS0lEUzEgPSBpZmVsc2UoS0lEUyA+MCwgMSwgMCkpJT4lCiAgZ3JvdXBfYnkoQUdFQ0wsIEtJRFMxLCBFRFVDKSAlPiUKICBzdW1tYXJpc2UoYXZnX0RFQlQySU5DID0gbWVhbihERUJUMklOQywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYXZnX05FV1dPUlRIID0gbWVhbihORVRXT1JUSCwgbmEucm0gPSBUUlVFKSklPiUKICBhcnJhbmdlKEFHRUNMKQpgYGAKCgpgYGB7cn0KcDIgPC0gZ2dwbG90KGRhdGF3aG8yKSArIGdlb21fY29sKGFlcyh4PUVEVUMsIHk9YXZnX0RFQlQySU5DLCBmaWxsID0gJ3JlZCcgKSkgKyBmYWNldF93cmFwKHZhcnMoS0lEUzEpKSArIGxhYnModGl0bGUgPSAiUmVsYXRpb25zaGlwIGJldHdlZW4gZGVidCB0byBpbmNvbWUgYW5kIGVkdWNhdGlvbiBkZWdyZWUiKQpwMgpgYGAKCmBgYHtyfQpwMyA8LSBnZ3Bsb3QoZGF0YXdobzEpICsgZ2VvbV9ib3hwbG90KGFlcyh5PURFQlQySU5DLCBjb2xvciA9IGZhY3RvcihFRFVDKSkpICsgc2NhbGVfeV9sb2cxMCgpICsgbGFicyh0aXRsZSA9ICJSZWxhdGlvbnNoaXAgYmV0d2VlbiBkZWJ0IHRvIGluY29tZSBhbmQgZWR1Y2F0aW9uIGRlZ3JlZSIpCnAzCmBgYApJIHdvdWxkIHJlY29tbWVuZCB0aGUgYm94IHBsb3QuIEl0IHNob3V3cyB0aGUgdGVuZGVueSB0aGUgZGVidCB0byBpbmNvbWUgY2hhbmdlIGluIGRpZmZlcmVudCBlZHVjYXRpb24gZ3JvdXBzLiBBbmQgaXQgY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIEkgdXNlIHRoZSBhdmVyYWdlIG9mIGRlYnQgdG8gaW5jb21lIGluIGRpZmZlcmVudCBlZHVjdGlvbiBsZXZlbHMuCgojIyAzLiBXZWFsdGggYW5kIEluY29tZSBEaXN0cmlidXRpb24KCldlIG1heSBleHBlY3QgaG91c2Vob2xkcyB3aXRoIGhpZ2hlciBpbmNvbWVzLCBsYXJnZXIgY2FwaXRhbCBnYWlucywgYW5kIG1vcmUgd2VhbHRoIHRvIGdlbmVyYWxseSBiZSBsZXNzIGluZGVidGVkLiBPbiB0aGUgb3RoZXIgaGFuZCwgaGlnaGVyIGluY29tZXMgbWF5IGJlIHRoZSByZXN1bHQgb2YgbG9uZ2VyIChhbmQgcG90ZW50aWFsbHkgbW9yZSBleHBlbnNpdmUpIGVkdWNhdGlvbi4gQWdhaW4sIHVzaW5nIHRoZSBkYXRhIGZyb20gMjAxNiBvbmx5LCBpbnZlc3RpZ2F0ZSBob3cgaW5jb21lIGFuZCB3ZWFsdGggYXJlIHJlbGF0ZWQgdG8gc3R1ZGVudCBsb2FuIGRlYnQuIENvbnNpZGVyIHVzaW5nIHRoZSB2YXJpYWJsZXMgSW5jb21lIHBlcmNlbnRpbGUgZ3JvdXBzIChJTkNDQVQpIGFuZCBOZXQgd29ydGggcGVyY2VudGlsZSBncm91cHMgKE5XQ0FUKSBmb3IgdGhpcyBhbmFseXNpcy4KClNob3cgMS0yIHZpc3VhbGl6YXRpb25zIGZvciB0aGlzIHNlY3Rpb24sIGFuZCBhcyBiZWZvcmUsIGJyaWVmbHkgdGVsbCB0aGUgZWRpdG9yIHdoYXQgeW91IHJlY29tbWVuZC4KCmBgYHtyfQpkYXRhMjAxNiA8LSBmaWx0ZXIoZGF0YSwgWUVBUiA9PSAyMDE2KQpgYGAKCmBgYHtyfQp3ZWFsZGF0YSA8LSBzZWxlY3QoZGF0YTIwMTYsIGMoIkVEVUMiLCJFRE5fSU5TVCIsIklOQ0NBVCIsIk5XQ0FUIikpCmBgYAoKYGBge3J9CndlYWxkYXRhMiA8LSB3ZWFsZGF0YSAlPiUKICBncm91cF9ieShOV0NBVCwgSU5DQ0FUKSAlPiUKICBzdW1tYXJpc2UoYXZnX2VkbiA9IG1lYW4oRUROX0lOU1QpKQp3MiA8LSBnZ3Bsb3Qod2VhbGRhdGEyKSArIGdlb21fY29sKGFlcyhJTkNDQVQsIGF2Z19lZG4pKSArIGZhY2V0X3dyYXAodmFycyhOV0NBVCkpIAp3MgpgYGAKYGBge3J9CnczIDwtIGdncGxvdCh3ZWFsZGF0YSkgKyBnZW9tX2JveHBsb3QoYWVzKHkgPSBFRE5fSU5TVCwgY29sb3IgPSBmYWN0b3IoSU5DQ0FUKSkpICsgc2NhbGVfeV9sb2cxMCgpCnczCmBgYAoKRm9yIHBlb3BsZSBmcm9tIGhpZ2hlciBpbmNvbWUgcGVyY2VudGlsZSBncm91cHMsIHRoZXkgd291bGQgcHJvYmFibHkgaGF2ZSBtb3JlIGVkdWNhdGlvbiBsb2Fucy4gQW5kIGZvciBwZW9wbGUgd2hvIGFyZSByaWNoLCB0aGV5IHdvdWxkIGhhcmRseSBoYXZlIGVkdWNhdGlvbiBsb2Fucy4gSSB3b3VsZCByZWNvbW1lbmQgZWRpdG9yIHRvIGNvbWJpbmUgdHdvIGdyYXBocyB0b2dldGhlciwgc2luY2UgaXQgY2FuIHNob3cgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVkdWNhdGlvbiBsb2FucywgaW5jb21lLCBlZHVjYXRpb24gZGVncmVlIGFuZCB0aGUgbmV0d29ydGguCgojIyMgNC4gR29pbmcgYnJva2UKCmBgYHtyfQpicm9rZV9kYXRhIDwtIHNlbGVjdChkYXRhMjAxNiwgYygiQk5LUlVQTEFTVDUiLCJGT09ESE9NRSIsIkZPT0RERUxWIiwiRk9PREFXQVkiLCJQSVJUT1RBTCIpKQpgYGAKCmBgYHtyfQpicm9rZV9kYXRhMiA8LSBkYXRhICU+JQogIGdyb3VwX2J5KEJOS1JVUExBU1Q1LCBZRUFSKSAlPiUKICBzdW1tYXJpc2UoCiAgICBhdmdfZWR1X2RlYnRfcmF0aW8gPSBtZWFuKEVETl9JTlNUL0RFQlQsIG5hLnJtID0gVFJVRSkKICApCmJyb2tlX2RhdGEyCmBgYAoKYGBge3J9CmIyIDwtIGdncGxvdChmaWx0ZXIoYnJva2VfZGF0YTIsIFlFQVIgPiAxOTk2KSwgYWVzKHg9IFlFQVIsIHkgPSBhdmdfZWR1X2RlYnRfcmF0aW8pKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IixhZXMoZmlsbCA9IGZhY3RvcihCTktSVVBMQVNUNSkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgZ2d0aXRsZSgiQXZlcmFnZSByYXRpbyBvZiBFRFVDL0RFQlQgZnJvbSAxOTk4LTIwMTYiKSAKYjIKYGBgCkZvciBwZW9wbGUgd2hvIGZpbmFsbHkgZ28gYmFua3J1cHQsIHRoZXkgdXN1YWxseSBoYXZlIGhpZ2hlciBlZHVjYXRpb24gbG9hbiB0aGFuIHBlb3BsZSB3aG8gZG9uJ3QgZ28gYmFua3J1cHQuIEFuZCBhcyB0aW1lIHdlbnQgYnksIHRoZSBlZHVjYXRpb24gbG9hbiB0YWtlcyBhIGxhcmdlIHByb3BvdGlvbiBvZiB0b3RhbCBkZWJ0LgoKYGBge3J9CmJyb2tlX2RhdGExIDwtIGJyb2tlX2RhdGElPiUKICBmaWx0ZXIoQk5LUlVQTEFTVDUgPT0gMSkgJT4lCiAgbXV0YXRlKGdvb2Rmb29kID0gRk9PREFXQVkgKyBGT09EREVMVikKYGBgCgpgYGB7cn0KZiA8LSBnZ3Bsb3QoYnJva2VfZGF0YTEsIGFlcyh5ID0gUElSVE9UQUwpKSArIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gZ29vZGZvb2QsIGNvbCA9ICJnb29kZm9vZCIpKSArIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gRk9PREhPTUUsIGNvbCA9ICdGT09ESE9NRScpKSArIGxhYnMoeCA9ICJjb3VudCIsIHkgPSAiUGlyb3RvdGFsIiwgdGl0bGUgPSAiQmFua3J1cHQgcGVvcGxlIG5vbi10aHJpZnR5IGJlaGF2aW9yIikgIApmCmBgYApGb3IgcGVvcGxlIHdobyBnbyBiYW5rcnVwdCwgdGhleSB0ZW5kIHRvIGVhdCBhdCBob21lIHJhdGhlciB0aGFuIGhhdmUgZm9vZCBkZWxpdmVyeSBvciBlYXQgb3V0c2lkZS4KCmBgYHtyfQpicm9rZV9kYXRhMyA8LSBicm9rZV9kYXRhJT4lCiAgZmlsdGVyKEJOS1JVUExBU1Q1ID09IDApICU+JQogIG11dGF0ZShnb29kZm9vZCA9IEZPT0RBV0FZICsgRk9PRERFTFYpCmBgYAoKYGBge3J9CmcgPC0gZ2dwbG90KGJyb2tlX2RhdGEzKSArIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gZ29vZGZvb2QsIHkgPSBGT09ESE9NRSkpICtnZW9tX2FibGluZShhZXMoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLCBjb2xvciA9ICJyZWQiKSkgKyB4bGltKDAsIDEwMDAwKSArIHlsaW0oMCwgMTAwMDApCmcgCmBgYApQZW9wbGUgd2hvIGRvbid0IGdvIGJhbmtydXB0IHRlbmQgdG8gZWF0IGF0IGhvbWUgcmF0aGVyIHRoYW4gZWF0IG91dHNpZGUgb3IgaGF2ZSBhIGZvb2QgZGVsaXZlcnkuIEhvd2V2ZXIsIHRoZSB0ZW5kZW5jeSB0aGV5IG9yZGVyIGEgZm9vZCBkZWxpdmVyeSBvciBlYXQgb3V0c2lkZSBpcyBtdWNoIGhpZ2hlciB0aGFuIHBlb3BsZSB3aG8gZ28gYmFua3J1cHQuCgojIyMgNS4gTWFrZSB0d28gcGxvdHMgaW50ZXJhY3RpdmUgCmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKZ2dwbG90bHkoYjIpCmBgYApUaGlzIGdyYXBoIGNhbiB0ZWxsIHBlb3BsZSBob3cgdGhlIGVkdWNhdGlvbiBsb2FuIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgaW4gdGhlIHRvdGFsIGRlYnQgcGVvcGxlIGhhdmUgYXMgdGltZSB3ZW50IGJ5LgoKYGBge3J9CmdncGxvdGx5KGJhcikKYGBgClRoaXMgZ3JhcGggaW5kaWNhdGUgdGhhdCBpbiBlYWNoIHllYXIsIGRpZmZlcmVudCB0eXBlcyBvZiBsb2FucyBwZW9wbGUgaGF2ZSwgYW5kIHJlYWRlcnMgY2FuIGhhdmUgc3RyYWlnaHRmb3J3YXJkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFuZ2Ugb2YgYW1vdW50IGVhY2ggbG9hbiBpbiBkaWZmZXJlbnQgeWVhcnMuCiMjIyA2LiBEYXRhIFRhYmxlIApgYGB7cn0KbGlicmFyeShEVCkKZGF0YWZpbmFsIDwtIGRhdGEgJT4lCiBncm91cF9ieShBR0VDTCxZRUFSKSAlPiUKIHN1bW1hcmlzZSgKICAgYXZnX2luc3RhbGwgPSBtZWFuKElOU1RBTEwsbmEucm0gPSBUUlVFKSwKICAgICAgICAgICBhdmdfdmVoaSA9IG1lYW4oVkVIX0lOU1QsbmEucm0gPSBUUlVFKSwKICAgICAgICAgICBhdmdfZWR1ID0gbWVhbihFRE5fSU5TVCxuYS5ybSA9IFRSVUUpLAogICAgICAgICAgIGF2Z19tb3J0ID0gbWVhbihOSF9NT1JULG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgYXZnX290aCA9IG1lYW4oT1RITE9DLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgIGF2Z19jY2IgPSBtZWFuKENDQkFMLCBuYS5ybSA9IFRSVUUpKSAKZGF0YXRhYmxlKGRhdGFmaW5hbCkKYGBgCgpgYGB7cn0KZGF0YWZpbmFsICU+JQogIGRhdGF0YWJsZSgKICAgIHJvd25hbWVzID0gRkFMU0UsCiAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIpLAogICAgb3B0aW9ucyA9IGxpc3QobGFuZ3VhZ2UgPSBsaXN0KHNTZWFyY2ggPSAiRmlsdGVyOiIpKQogICkKYGBgCiBUaGlzIHRhYmxlIGlzIGdvaW5nIHRvIGxvb2sgYXQgYXQgZGlmZmVyZW50IHllYXJzLCBhdCBkaWZmZXJlbnQgYWdlIGdyb3VwcyB0aGUgYXZlcmFnZSBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgbG9hbnMgdGhlIGhvdXNlaG9sZGVycyBoYXZlLgoKCgoKCgoKCgoK